// 基础库
#include <stdio.h>
#include <math.h>
#include <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_log.h"
#include "esp_timer.h"
// ESPIDF官方组件库
#include "led_strip.h"
// 第三方拓展库
#include "OLED.h"
#include "ws2812.h"

/**
 * @brief HSV到RGB颜色转换函数
 * @param h 色相 (0.0-1.0)
 * @param s 饱和度 (0.0-1.0)
 * @param v 明度 (0.0-1.0)
 * @param r 输出红色分量 (0.0-1.0)
 * @param g 输出绿色分量 (0.0-1.0)
 * @param b 输出蓝色分量 (0.0-1.0)
 */
void hsv_to_rgb(float h, float s, float v, float *r, float *g, float *b)
{
    int i;
    float f, p, q, t;

    if (s == 0)
    {
        *r = *g = *b = v;
        return;
    }

    h *= 6;
    i = (int)floorf(h);
    f = h - i;
    p = v * (1 - s);
    q = v * (1 - s * f);
    t = v * (1 - s * (1 - f));

    switch (i)
    {
    case 0:
        *r = v;
        *g = t;
        *b = p;
        break;
    case 1:
        *r = q;
        *g = v;
        *b = p;
        break;
    case 2:
        *r = p;
        *g = v;
        *b = t;
        break;
    case 3:
        *r = p;
        *g = q;
        *b = v;
        break;
    case 4:
        *r = t;
        *g = p;
        *b = v;
        break;
    default:
        *r = v;
        *g = p;
        *b = q;
        break;
    }
}

void OLED_display_task(void *pvParameters)
{
    ESP_LOGI("OLED_display_task", "Starting OLED display task");

    float oled_time = 0.0f;
    float oled_wave_speed = 0.25f;     // 大幅提高OLED水波速度
    float oled_wave_frequency = 0.12f; // 降低频率，让波浪更宽

    while (1)
    {
        vTaskDelay(pdMS_TO_TICKS(10));
        OLED_Clear();

        // 显示标题
        OLED_ShowString(28, 0, "ESPRESSIF", OLED_8X16);
        OLED_ShowChinese(32, 16, "乐鑫科技");
        // 绘制增强的水波效果（在屏幕下半部分）
        for (int x = 0; x < 128; x++) // 逐像素绘制，提高精度
        {
            // 计算主水波（大振幅）- 从左到右传播
            float wave_phase1 = (float)x * oled_wave_frequency - oled_time * oled_wave_speed;
            float wave_height1 = sinf(wave_phase1) * 10.0f; // 增大振幅到10像素
            int y_wave1 = 48 + (int)wave_height1;           // 水波中心线位置

            // 计算第二条水波（中等振幅，相位偏移）- 从左到右传播
            float wave_phase2 = wave_phase1 + 1.5f;
            float wave_height2 = sinf(wave_phase2) * 7.0f; // 中等振幅
            int y_wave2 = 50 + (int)wave_height2;

            // 计算第三条水波（小振幅，不同相位）- 从左到右传播
            float wave_phase3 = wave_phase1 + 3.0f;
            float wave_height3 = sinf(wave_phase3) * 4.0f; // 小振幅
            int y_wave3 = 46 + (int)wave_height3;

            // 绘制主水波（粗线条，更明显）
            if (y_wave1 >= 32 && y_wave1 < 64)
            {
                OLED_DrawPoint(x, y_wave1);
                // 绘制上下邻近点，增强视觉效果
                if (y_wave1 > 32)
                    OLED_DrawPoint(x, y_wave1 - 1);
                if (y_wave1 < 63)
                    OLED_DrawPoint(x, y_wave1 + 1);
            }

            // 绘制第二条水波
            if (y_wave2 >= 32 && y_wave2 < 64)
            {
                OLED_DrawPoint(x, y_wave2);
            }

            // 绘制第三条水波（细线）
            if (y_wave3 >= 32 && y_wave3 < 64)
            {
                OLED_DrawPoint(x, y_wave3);
            }
        }

        OLED_Update();

        // 更新时间，加快动画速度
        oled_time += 0.6f; // 大幅增加时间增量
        if (oled_time > 100.0f)
        {
            oled_time = 0.0f; // 防止数值过大
        }
    }
}
void ws2812_task(void *pvParameters)
{
    ESP_LOGI("ws2812_task", "Starting WS2812 task");

    float time = 0.0f;
    float wave_speed = 0.15f;          // 水波传播速度 (从左到右)
    float wave_frequency = 0.25f;      // 水波频率
    float color_change_speed = 0.001f; // 颜色变化速度，更慢更平滑
    float color_hue = 0.0f;            // 当前颜色的色相

    while (1)
    {
        // 平滑的颜色循环渐变
        color_hue += color_change_speed;
        if (color_hue >= 1.0f)
        {
            color_hue = 0.0f; // 循环回到起始色相
        }

        // 为每个LED计算水波亮度和颜色
        for (int i = 0; i < LED_STRIP_LED_COUNT; i++)
        {
            // 计算水波效果 - 从左到右传播 (负号改变方向)
            float wave_phase = (float)i * wave_frequency - time * wave_speed;
            float wave_amplitude = (sinf(wave_phase) + 1.0f) * 0.5f; // 归一化到0-1，允许到达0

            // 为每个LED添加颜色偏移，增强彩虹渐变效果
            float led_color_offset = (float)i / LED_STRIP_LED_COUNT * 0.3f; // 30%的色相偏移
            float current_hue = color_hue + led_color_offset;
            if (current_hue >= 1.0f)
            {
                current_hue -= 1.0f; // 保持在0-1范围内
            }

            // 将色相转换为RGB
            float r, g, b;
            hsv_to_rgb(current_hue, 1.0f, wave_amplitude, &r, &g, &b);

            // 设置LED颜色
            uint8_t red = (uint8_t)(r * 255);
            uint8_t green = (uint8_t)(g * 255);
            uint8_t blue = (uint8_t)(b * 255);

            led_strip_set_pixel(led_strip, i, red, green, blue);
        }

        // 刷新LED条带
        led_strip_refresh(led_strip);

        // 更新时间
        time += 0.4f; // 时间增量

        vTaskDelay(pdMS_TO_TICKS(25)); // 25ms延时，平滑动画
    }
}

void app_main()
{
    OLED_Init();
    ws2812_init();
    xTaskCreate(OLED_display_task, "OLED_display_task", 2048, NULL, 5, NULL);
    xTaskCreate(ws2812_task, "ws2812_task", 2048, NULL, 5, NULL);

    while (1)
    {
        vTaskDelay(pdMS_TO_TICKS(1000));
        ESP_LOGI("app_main", "Hello World");
    }
}
